/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Principal;

/**
 * @author Tesla
 */
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Properties;
import java.util.logging.Level;
import javax.imageio.ImageIO;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintServiceAttributeSet;
import javax.print.attribute.PrintServiceAttributeSet;
import javax.print.attribute.standard.PrinterName;

public class TicketCorte{
    static jcProperties editarpropiedades = new jcProperties();
    static Properties propiedades;
    static PrinterJob job = PrinterJob.getPrinterJob();
  //  static DocPrintJob job = service.createPrintJob();
    public static String fecha="";
    public static String fechafinal="";
    static PageFormat format = job.getPageFormat(null);
    static Paper paper = new Paper();
    static PrintService[] printServices;
    static PrintService printService;
    public static int size = 0;//0 = 80mm, 1 = 55mm
    static ArrayList<String> CabezaLineas = new ArrayList<>();
    public static ArrayList<String> subCabezaLineas = new ArrayList<>();
    static ArrayList<String> LineasPie = new ArrayList<>();
    public static ArrayList<String> items = new ArrayList<>();
    public static ArrayList<String> cantidades = new ArrayList<>();
    public static float enCaja=0.0f;
    static boolean impreso = false;
    public static String nombre="";
    public static float total =0.0f;
    static NumberFormat fmt = NumberFormat.getInstance();
    static Printable imprimir;
    static Number number;  
    NumberFormat formatter=NumberFormat.getCurrencyInstance();;
    public TicketCorte(){
        
        switch (size){
            case 0:
                imprimir =new Printable() {
            @Override
            public int print(Graphics pg, PageFormat pf, int pageNum)
                    throws PrinterException {
                if (pageNum > 0) {
                    return Printable.NO_SUCH_PAGE;
                }
                if(!impreso)
                    impreso=true;
                else
                try {
                    Graphics2D g2 = (Graphics2D) pg;
                    int x = (int) pf.getImageableX();
                    int y = (int) pf.getImageableY();
                    int posy = 55;//posicion desde donde empieza a imprimir
                    g2.setFont(new Font("CourierThai", Font.PLAIN, 8));
                    g2.translate(pf.getImageableX(), pf.getImageableY());
                    File img = new File("TESLAbem_logo_ticket.jpg");
                    BufferedImage in = ImageIO.read(img);
                    g2.drawImage(in, x, y, 200, 50, null);
                    int textHeight = g2.getFontMetrics().getHeight();
                    int stringLen;
                    for (int i = 0; i < CabezaLineas.size(); i++) {
                        stringLen = (int) g2.getFontMetrics().getStringBounds(CabezaLineas.get(i), g2).getWidth(); //esto determina la longitud de la cadena
                        g2.drawString(CabezaLineas.get(i), 105 - stringLen / 2, posy);//esto la dibuja en medio
                        posy += textHeight;
                    }
                    for (int i = 0; i < subCabezaLineas.size(); i++) {
                        g2.drawString(subCabezaLineas.get(i), x, posy);
                        posy += textHeight;
                    }
                   g2.drawString("Fecha de Inicio: "+fecha, x, posy); 
                   posy += textHeight;
                   g2.drawString("Fecha de Cierre: "+fechafinal, x, posy); 
                   posy += textHeight;
                        g2.drawString("Vendedor: "+nombre, x, posy); 
                         posy+=2;
                    g2.drawLine(0, posy, 272, posy);
                    posy+=textHeight;
                        g2.drawString("Concepto                                                          Cantidad", x, posy);//esto la dibuja en medio
                        posy += 2;
                     g2.drawLine(0, posy, 272, posy);
                    posy+=textHeight;  
                                        for (int i = 0; i < items.size(); i++) {
                        g2.drawString(items.get(i), x, posy);
                        g2.drawString(cantidades.get(i), 165, posy);
                        posy += textHeight;
                    }
                    posy -= 2;
                    g2.drawLine(0, posy, 272, posy);
                    posy+=textHeight;     
                    g2.drawString("Total:", x, posy);
                    stringLen = (int) g2.getFontMetrics().getStringBounds(formatter.format(total), g2).getWidth();
                    g2.drawString(formatter.format(total), 205 - stringLen, posy);
                    posy += textHeight;
                    g2.drawString("En Caja:", x, posy);
                    stringLen = (int) g2.getFontMetrics().getStringBounds(formatter.format(enCaja), g2).getWidth();
                    g2.drawString(formatter.format(enCaja), 205 - stringLen, posy);
                    posy += textHeight;
                    g2.drawString("Diferencia:", x, posy);
                    stringLen = (int) g2.getFontMetrics().getStringBounds(formatter.format(enCaja-total), g2).getWidth();
                    g2.drawString(formatter.format(enCaja-total), 205 - stringLen, posy);
                    posy += textHeight;
                                  stringLen = (int) g2.getFontMetrics().getStringBounds("¡MUCHAS GRACIAS POR SU ATENCION!", g2).getWidth(); //esto determina la longitud de la cadena
                        g2.drawString("¡MUCHAS GRACIAS POR SU ATENCION!", 105 - stringLen / 2, posy);//esto la dibuja en medio
                        posy += 3*textHeight;
                    for (int i = 0; i < LineasPie.size(); i++) {
                        stringLen = (int) g2.getFontMetrics().getStringBounds(LineasPie.get(i), g2).getWidth();
                        g2.drawString(LineasPie.get(i), 105 - stringLen / 2, posy);
                        posy += textHeight;
                    }
paper.setSize(226, posy);
                } catch (IOException ex) {System.out.println("aca esta el error "+ex.getMessage());
                }
                return Printable.PAGE_EXISTS;
            }
        };
                break;
            case 1: 
                imprimir = new Printable() {
            @Override
            public int print(Graphics pg, PageFormat pf, int pageNum)
                    throws PrinterException {
                if (pageNum > 0) {
                    return Printable.NO_SUCH_PAGE;
                }
                if(!impreso)
                    impreso=true;
                else
                try {
                    Graphics2D g2 = (Graphics2D) pg;
                    int x = (int) pf.getImageableX();
                    int y = (int) pf.getImageableY();
                    int posy = 55;//posicion desde donde empieza a imprimir
                    g2.setFont(new Font("CourierThai", Font.PLAIN, 8));
                    g2.translate(pf.getImageableX(), pf.getImageableY());
                    File img = new File("TESLAbem_logo_ticket.jpg");
                    BufferedImage in = ImageIO.read(img);
                    g2.drawImage(in, x, y, 200, 50, null);
                    int textHeight = g2.getFontMetrics().getHeight();
                    int stringLen;
                    for (int i = 0; i < CabezaLineas.size(); i++) {
                        stringLen = (int) g2.getFontMetrics().getStringBounds(CabezaLineas.get(i), g2).getWidth(); //esto determina la longitud de la cadena
                        g2.drawString(CabezaLineas.get(i), 105 - stringLen / 2, posy);//esto la dibuja en medio
                        posy += textHeight;
                    }
                    for (int i = 0; i < subCabezaLineas.size(); i++) {
                        g2.drawString(subCabezaLineas.get(i), x, posy);                        
                        g2.drawString(cantidades.get(i), 200-25, posy);
                        posy += textHeight;
                    }
                   g2.drawString("Fecha de Inicio: "+fecha, x, posy); 
                   posy += textHeight;
                   g2.drawString("Fecha de Final: "+fechafinal, x, posy); 
                   posy += textHeight;
                        g2.drawString("Vendedor: "+nombre, x, posy); 
                         posy+=2;
                    g2.drawLine(0, posy, 272, posy);
                    posy+=textHeight;
                        g2.drawString("Concepto                                                          Cantidad", x, posy);//esto la dibuja en medio
                        posy += 2;
                     g2.drawLine(0, posy, 272, posy);
                    posy+=textHeight;  
                                        for (int i = 0; i < items.size(); i++) {
                        g2.drawString(items.get(i), x, posy);
                        posy += textHeight;
                    }
                    posy -= 2;
                    g2.drawLine(0, posy, 272, posy);
                    posy+=textHeight;     
                    g2.drawString("Total:", x, posy);
                    stringLen = (int) g2.getFontMetrics().getStringBounds(formatter.format(total), g2).getWidth();
                    g2.drawString(formatter.format(total), 205 - stringLen, posy);
                    posy += textHeight;
                    g2.drawString("En Caja:", x, posy);
                    stringLen = (int) g2.getFontMetrics().getStringBounds(formatter.format(enCaja), g2).getWidth();
                    g2.drawString(formatter.format(enCaja), 205 - stringLen, posy);
                    posy += textHeight;
                    g2.drawString("Diferencia:", x, posy);
                    stringLen = (int) g2.getFontMetrics().getStringBounds(formatter.format(enCaja-total), g2).getWidth();
                    g2.drawString(formatter.format(enCaja-total), 205 - stringLen, posy);
                    posy += textHeight;
                                  stringLen = (int) g2.getFontMetrics().getStringBounds("¡MUCHAS GRACIAS POR SU ATENCION!", g2).getWidth(); //esto determina la longitud de la cadena
                        g2.drawString("¡MUCHAS GRACIAS POR SU ATENCION!", 105 - stringLen / 2, posy);//esto la dibuja en medio
                        posy += 3*textHeight;
                    for (int i = 0; i < LineasPie.size(); i++) {
                        stringLen = (int) g2.getFontMetrics().getStringBounds(LineasPie.get(i), g2).getWidth();
                        g2.drawString(LineasPie.get(i), 105 - stringLen / 2, posy);
                        posy += textHeight;
                    }
paper.setSize(226, posy);
                } catch (IOException ex) {System.out.println("aca esta el error "+ex.getMessage());
                }
                return Printable.PAGE_EXISTS;
            }
        };
                break;
        }
                
        CabezaLineas.clear();
        LineasPie.clear();
        try {
            AddCabecera("******CORTE DE CAJA******");
            PreparedStatement ps = local_connection.cn.prepareStatement("select linea from lineasticket where sucursal = ? and cabeza = 1");
            ps.setInt(1, VentanaPrincipal.sucursal);
            ResultSet rs= ps.executeQuery();
            while(rs.next()){
                AddCabecera(rs.getString(1));
            }
             ps = local_connection.cn.prepareStatement("select linea from lineasticket where sucursal = ? and cabeza = 0");
             ps.setInt(1, VentanaPrincipal.sucursal);
             rs= ps.executeQuery();
            while(rs.next()){
                AddPieLinea(rs.getString(1));
            }
        } catch (SQLException ex) {
            VentanaPrincipal.logger.log(Level.SEVERE, null, ex);
        }
        /*AddCabecera("REPECO");
        AddCabecera("Michel Morales Molina");
        AddCabecera("RFC MOMM8804289V1");
        AddCabecera("11 PONIENTE 113 COLONIA CENTRO");
        AddCabecera("PUEBLA, PUE. TEL.(222)232-1705");*/
        AddCabecera(DarEspacio());
        /*AddPieLinea("¡GRACIAS POR TU COMPRA!");
        AddPieLinea("www.teslabem.com");*/
         propiedades = new Properties();
        propiedades = editarpropiedades.getProperties();
        PrintServiceAttributeSet printServiceAttributeSet = new HashPrintServiceAttributeSet();
        printServiceAttributeSet.add(new PrinterName(propiedades.getProperty("impresoraTicket"), null));
        printServices = PrintServiceLookup.lookupPrintServices(null, printServiceAttributeSet);
        //Los bordes y el tamaño del papel
       paper.setImageableArea(3, 0.0, 227, 1000);
        format.setPaper(paper);
        //imprimir ticket
          try {
            printService = printServices[0];
            job.setPrintService(printService);   // intentare imprimir con la impresora de tickets
        } catch (ArrayIndexOutOfBoundsException e) {
            System.err.println("Error: No se encontro la impresora '" + propiedades.getProperty("impresoraTicket") + "', usare la impresora por default");
        } catch (PrinterException exception) {
            VentanaPrincipal.logger.log(Level.SEVERE, null, exception);
        }
         job.setPrintable(imprimir,format);
                 
    }

    public static void AddCabecera(String line) {
        CabezaLineas.add(line);
    }

    public static void AddSubCabecera(String line) {
        subCabezaLineas.add(line);
    }



    public static void AddPieLinea(String line) {
        LineasPie.add(line);
    }
public static void AddItem(String concepto) {
        items.add(concepto);   
    }
public static void AddCantidad(String cantidad) {
        cantidades.add(cantidad);   
    }
    public static String DarEspacio() {
        return "\n";
    }

    /**
     *
     */
    
   

       
       
       
    
   
}
